package com.biodiv.miracle.event.core;

import com.biodiv.miracle.event.EventObject;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: tianquan
 * @date: 2024-10-12  16:08
 * @Description: 用于管理事件监听器的注册和事件的发布
 */
public class EventSourceManager implements EventSource {

    // 存储所有事件监听器的列表
    private final List<EventListener> listeners = new ArrayList<>();

    /**
     * 添加单个事件监听器
     *
     * @param listener 要添加的事件监听器
     */
    @Override
    public void addEventListener(EventListener<?> listener) {
        listeners.add(listener);
    }

    /**
     * 批量添加事件监听器
     *
     * @param listeners 要添加的事件监听器列表
     */
    @Override
    public void addEventListeners(List<EventListener> listeners) {
        this.listeners.addAll(listeners);
    }

    /**
     * 移除事件监听器
     *
     * @param listener 要移除的事件监听器
     */
    @Override
    public void removeEventListener(EventListener<?> listener) {
        listeners.remove(listener);
    }

    /**
     * 发布事件给所有注册的监听器
     * 监听器只会接收它们订阅的事件类型
     *
     * @param eventObject 要发布的事件对象
     */
    @Override
    public void publishEvent(EventObject eventObject) {
        // 遍历所有监听器，找到对应的事件调用onEvent方法
        for (EventListener listener : listeners) {
            // 获取到当前监听器监听的事件类型
            Type[] interfaces = listener.getClass().getGenericInterfaces();
            for (Type type : interfaces) {
                if (type instanceof ParameterizedType parameterizedType) {
                    Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                    if (actualTypeArguments.length > 0 && actualTypeArguments[0] instanceof Class<?> genericType) {
                        // 检查当前事件是否是监听器订阅的类型
                        if (genericType.isInstance(eventObject)) {
                            listener.onEvent(eventObject);
                        }
                    }
                }
            }
        }
    }
}

